package org.ManagerSystem.intercepter;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class LoginInterceptor extends HandlerInterceptorAdapter{

    @Override
    //校验访问的用户是否已经登陆，若已登陆继续执行，未登陆则返回登陆页面
    public boolean preHandle(HttpServletRequest request , HttpServletResponse response , Object handler) throws Exception{

        //定义并初始化 eusername 变量
        String eusername = null;

        //获取 session
        HttpSession session = request.getSession(false);

        //获取 URL 中的用户名信息
        String uri = request.getRequestURI();
        String[] uriArray = uri.split("/");

        /** 判断session是否过期，若过期则弹出警告让其重新登陆
         *      1.若 session 为 null ，cookie 中有 eusername 的数据，则为 session 过期
         *      2.若 session 为 null  ， cookie中也没 eusername 的数据，则为未登录
         */
        if(session == null){
            //获取 cookie
            Cookie[] cookies = request.getCookies();
            //若 cookies 为空，则为未登录
            if(cookies == null){
                response.sendRedirect("../");
                return false;
            }
            //设置一个计数器
            int i = 0;
            //遍历 cookie 是否有 eusername 这个数据
            for(Cookie cookie : cookies){
                //如果找到了 eusername 的 cookie 数据，并校验值通过，计数器 +1
                if("eusername".equals(cookie.getName())){
                    if(uriArray[2].equals(cookie.getValue())){
                        i++;
                    }
                }
            }
            //如果 i>0 ,说明用户登录过，即 session 过期
            if(i>0){
                toAlert(response);
                return false;
            }
            //若 i = 0 ，说明用户未登陆
            response.sendRedirect("../");
            return false;
        }

        //获取 session 中保存的已登陆的用户的用户名
        eusername = (String)session.getAttribute("eusername");

        /**将 session 中的用户名和 uri 中的用户名信息比对，能对应则放行，不能对应返回登陆页面
         * 此处可能抛出空指针异常:
         *      1.因为当 session 存在但是其中无数据时 eusername 为 null
         */
        try{
            if (eusername.equals(uriArray[2])) {
                return true;
            }
            response.sendRedirect("../");
            return false;
        }catch (NullPointerException e){
            response.sendRedirect("../");
            return false;
        }
    }

    //当 session 过期时调用向前台打印信息
    public void toAlert(HttpServletResponse response){
        try{
            //设置将向前台传递的信息的格式
            response.setContentType("text/html;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");

            //获得输出流
            OutputStreamWriter out = new OutputStreamWriter(response.getOutputStream());

            //设置页面提示信息，并编码
            String msg="由于您长时间没有操作，会话已过期，请重新登录！";
            msg=new String(msg.getBytes("UTF-8"));

            //组装向页面输出的信息
            out.write("<meta http-equiv='Content-Type' content='text/html';charset='UTF-8'>");
            out.write("<script>");
            out.write("alert('"+msg+"');");
            out.write("top.location.href = '/ManagerSystem'; ");
            out.write("</script>");

            out.flush();
            out.close();

        }catch (IOException e){
            //TODO 捕获到异常后的处理
            e.printStackTrace();
        }
    }
}
